package comm

import (
	"strconv"
	"time"

	"github.com/name5566/leaf/log"
)

func Now() int64 {
	return time.Now().Unix()
}

func NowMill() int64 {
	return time.Now().UnixMilli()
}

func GetTimeByFmtYyMmDdhhmm(t string) int64 {
	tm, err := time.ParseInLocation("20060102-1504", t, time.Local)
	if err != nil {
		return 0
	}
	return tm.Local().Unix()
}

// 格式转时间戳
func YYMMDDHHmmToTimestamp(t uint64) int64 {
	year := t / 100000000
	month := (t % 100000000) / 1000000
	day := (t % 1000000) / 10000
	hour := (t % 10000) / 100
	minute := (t % 100)

	return time.Date(int(year), time.Month(month), int(day), int(hour), int(minute), 0, 0, time.Local).Unix()
}

// 获取今天开始
func GetDayZero(t int64) int64 {
	s := time.Unix(t, 0)
	return time.Date(s.Year(), s.Month(), s.Day(), 0, 0, 0, 0, time.Local).Unix()
}

// 是否为同一天
func IsSameDay(t1, t2 int64) bool {
	return GetDayZero(t1) == GetDayZero(t2)
}

// 一年第几周
func GetYweek(t int64) int {
	s := time.Unix(t, 0)
	d := s.YearDay()

	yday1 := time.Date(s.Year(), 1, 1, 0, 0, 0, 0, time.Local)
	d1 := yday1.YearDay()
	w1 := int(yday1.Weekday())
	if w1 == 0 {
		w1 = 7
	}
	nwd := 7 - w1 + 1 //再过几天 到下周一
	/*
		例如：1号周二 再过7-2+1=6(nwd)天下周一
		1)9号  = 1号+7*1+1	余数=1<nwd 周=周二+1=第2周 周三
		2)15号 = 1号+7*2	余数=0<nwd 周=周二+0=第3周 周二
		2)21号 = 1号+7*2+6	余数=6>=nwd 周=周二+6=第4周 周一
	*/
	r := (d - d1) / 7 //跨周 不分开始是周几
	if (d-d1)%7 >= nwd {
		r++
	}
	return r
}

func DiffDay(t1, t2 int64) uint32 {
	if t1 < t2 {
		t1, t2 = t2, t1
	}
	return uint32(GetDayZero(t1)-GetDayZero(t2)) / DAY_SECOND
}

// 今天:几点几分 的时间戳
func HHMMToTimestamp(hhmm uint32) int64 {
	tnow := time.Now()
	y := tnow.Year()
	m := tnow.Month()
	d := tnow.Day()

	tt := time.Date(y, m, d, int(hhmm/100), int(hhmm%100), 0, 0, time.Local).Unix()
	return tt
}

// 本周:周几 几点几分 的时间戳(周日请填写7)
func WeekHHMMToTimestamp(week, hhmm uint32) int64 {
	//今天HHMM
	tt := HHMMToTimestamp(hhmm)

	w := time.Now().Weekday()
	var offset int64 = (int64(week) - int64(w)) * DAY_SECOND
	tt += offset
	return tt
}

// 距离明天:HHMM 的时间差
func getNextDaySeconds(hhmm uint32) int64 {
	//今天HHMM + 1天 - 当前时间
	return HHMMToTimestamp(hhmm) + DAY_SECOND - Now()
}

// 距离下一次:周几 几点几分 的时间差
func getNextWeekDaySeconds(week, hhmm uint32) int64 {
	//本周HHMM
	next := WeekHHMMToTimestamp(week, hhmm)

	tnow := Now()
	if tnow > next {
		next += DAY_SECOND * 7
	}
	return next - tnow
}

func GetYYMMDD() uint32 {
	s := time.Now().Format("20060102")
	i, _ := strconv.ParseInt(s, 10, 64)
	return uint32(i)
}

func GetYYMMDD2(t int64) uint32 {
	var s time.Time
	if t == 0 {
		s = time.Now()
	} else {
		s = time.Unix(t, 0)
	}
	i, _ := strconv.ParseInt(s.Format("20060102"), 10, 64)
	return uint32(i)
}

func GenYYMMDD() string {
	return time.Now().Format("20060102")
}

func GetYYMM(t int64) string {
	s := time.Unix(t, 0)
	return s.Format("200601")
}

func GenYYMMDD2() string {
	return time.Now().Format("2006-01-02")
}

func GetYYMMDDHHmm(t int64) string {
	var s time.Time
	if t == 0 {
		s = time.Now()
	} else {
		s = time.Unix(t, 0)
	}
	return s.Format("20060102-1504") //05
}

func GetYYMMDDHHmmss() string {
	return time.Now().Format("2006-01-02 15:04:05") //05
}

func GetYYMMDDHHmmss2() string {
	return time.Now().Format("20060102-150405") //05
}

func GetHHMM() uint32 {
	s := time.Now().Format("1504")
	i, _ := strconv.ParseInt(s, 10, 64)
	return uint32(i)
}

func StatCostCpu(start time.Time, desc string) {
	tc := time.Since(start)
	if tc.Milliseconds() >= COST_CPU_WARNING {
		log.Release(desc+" cost cpu:%v", tc)
	}
}
